package org.hq.upvideo;

import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hq.config.WebMvcConfig;
import org.hq.jni.Imessage;
import org.hq.services.UpVideoService;
import org.hq.sql.SqlManageService;
import org.hq.sql.entity.GroupsVideo;
import org.hq.utils.GetSpringBean;
import org.hq.utils.HttpUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 更新 四虎网站视频数据 任务
 */
@Data
public class UpVideoTaskSiHu implements Runnable, Imessage {
    //服务更新
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private final Logger logger;//日记打印
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private final IupVideoService ups;//更新服务
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private final SqlManageService sql; //数据库管理对象
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private Document html = null;
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private int count = 0;//联网失败重新路径次数
    private VideoTaskEntity entity;//任务数据实体类
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private WebMvcConfig webMvcConfig;
    @Setter(AccessLevel.NONE)
    @Getter(AccessLevel.NONE)
    private HttpUtils http = null; // http 浏览器工具

    public UpVideoTaskSiHu() {
        this(null);
    }

    // 初始数据
    public UpVideoTaskSiHu(VideoTaskEntity entity) {
        this.http = GetSpringBean.getBean(HttpUtils.class);
        this.ups = GetSpringBean.getBean(UpVideoService.class);
        this.sql = GetSpringBean.getBean(SqlManageService.class);
        this.webMvcConfig = GetSpringBean.getBean(WebMvcConfig.class);
        this.logger = LoggerFactory.getLogger(UpVideoTaskSiHu.class);
        this.copy(entity);
    }

    public void copy(VideoTaskEntity pojo) {
        if (pojo == null) return;
        if (this.entity == null) {
            this.entity = new VideoTaskEntity(pojo);
        }

    }

    /**
     * 四虎网站 视频昵称 baseb64 解析
     * base解码（方法一）
     *
     * @param var 待解码字符串
     * @return 解码字符串
     */
    private String decode64(String var) {
        try {
            // 非空字符串才进行解码
            if (var == null && var.length() < 0) return null;
            // 查找匹配字符
            String findStrStart = "document.write";
            String findStrEnd = "'));";
            Pattern pattern = Pattern.compile(findStrStart);
            Matcher matcher = pattern.matcher(var);
            if (matcher.find()) {
                var = var.substring(matcher.end() + 4, var.indexOf(findStrEnd));
            }
            // 解码
            return new String(Base64.getDecoder().decode(var), "utf-8");
        } catch (Exception e) {

        }
        return null;


    }

    /**
     * 四虎网站 菜单页面解析
     */
    private void parseMenu() {
        try {
            String menuName = "";//菜单昵称
            String menuPath = "";//菜单路径

            String menuNameI = "";//菜单条目昵称
            String menuPathI = "";//菜单条目路径

            //定位到一级 菜单
            Elements menus = this.html.select("div.menu.clearfix > dl");
            // 遍历 一级 菜单
            for (Element menut : menus) {
                // 一级菜单 a 标签
                Element dt = menut.select("dt > a").first();
                // 一级菜单 路径
                menuPath = dt.attr("data-url");
                // 一级菜单昵称
                menuName = this.decode64(dt.data());
                //过滤图文 菜单
                if (!menuPath.equals("/pic/")) {
                    // 女优标签 菜单判断
                    if (menuName.equals("女优") && menuPath.equals("/av/")) {
                        //一级 女优标签 菜单添加到数据库
                        GroupsVideo g = new GroupsVideo();
                        g.setName(menuName);
                        g.setPath(menuPath);
                        this.sql.saveGroupsVideo("四虎", g, SqlManageService.AGETYPE_WEB);

                        //定位 女优标签 二级菜单
                        Elements dd = menut.select("dd > a");
                        // 遍历 女优标签 二级菜单
                        for (Element dda : dd) {
                            //女优标签 二级菜单路径
                            menuPathI = dda.attr("href");
                            //女优标签 二级菜单昵称
                            menuNameI = decode64(dda.data());
                            if (menuNameI.equals("女优合集") && menuPathI.equals("/av/index.html")) {
                                // 定位 女优合集条目
                                Elements itema = this.html.select("div.row.col6.clearfix > dl > dt > a");
                                // 遍历 女优合集条目
                                for (Element item : itema) {
                                    //女优标签 二级菜单昵称
                                    menuNameI = item.select("img").first().attr("alt");
                                    //女优标签 二级菜单路径
                                    menuPathI = item.attr("href");
                                    if (!menuNameI.equals("女优合集") && !menuPathI.equals("/av/index.html")) {
                                        // 女优合集处理
                                        GroupsVideo gi = new GroupsVideo();
                                        gi.setName(menuNameI);
                                        gi.setPath(menuPathI);
                                        this.sql.saveGroupsVideo(menuName, gi, SqlManageService.AGETYPE_ITEM);

                                    }
                                }

                            } else {
                                // 二级菜单 女优合集  处理
                                GroupsVideo gi = new GroupsVideo();
                                gi.setName(menuNameI);
                                gi.setPath(menuPathI);
                                this.sql.saveGroupsVideo(menuName, gi, SqlManageService.AGETYPE_ITEM);

                            }

                        }


                    } else {
                        // 不是女优标签  一级菜单 处理
                        GroupsVideo g = new GroupsVideo();
                        g.setName(menuName);
                        g.setPath(menuPath);
                        this.sql.saveGroupsVideo("四虎", g, SqlManageService.AGETYPE_WEB);

                        //定位 二级菜单
                        Elements dd = menut.select("dd > a");
                        for (Element dda : dd) {
                            // 二级菜单路径
                            menuPathI = dda.attr("href");
                            // 二级菜单昵称
                            menuNameI = decode64(dda.data());
                            // 二级菜单 处理
                            GroupsVideo gi = new GroupsVideo();
                            gi.setName(menuNameI);
                            gi.setPath(menuPathI);
                            this.sql.saveGroupsVideo(menuName, gi, SqlManageService.AGETYPE_ITEM);
                        }


                    }

                }
            }

        } catch (Exception e) {
            logger.error("解析菜单页面异常");
            this.ups.error(this.entity);
        }
    }


    /**
     * 四虎网站html解析 视频条目页面解析
     */
    private void videoItem() {
        try {
            //定位到视频条目
            Elements items = this.html.select("div.row.col5.clearfix > dl > dt > a");
            for (Element item : items) {
                String href = item.attr("href");
                // 封装数据 判断视频是否存在
                VideoTaskEntity enIs = new VideoTaskEntity();
                // 视频 html 获取路径
                enIs.setHtmlweb(href);
                //判断此条视频是否存在
                if (this.ups.addVideoItem(enIs) == 1) {
                    VideoTaskEntity en = new VideoTaskEntity(this.entity);
                    // 提交任务获取视频信息
                    en.setTaskType(EupVideoTaskType.PARSE_HTML_TASK_SAVE_SIHU_VIDEO_PLAY_PAGE);
                    en.setHtmlweb(href);
                    en.setTaskPath(href);
                    this.ups.submit(en);
                }

                //  System.out.println(href);
            }

        } catch (Exception e) {
            logger.error("视频条目页面 解析异常");
            this.ups.error(this.entity);
        }


    }

    /**
     * 解析 四虎网站 分组计算页面数量html 数据
     */
    private void groupPageCount() {
        try {
            //读取下一页的标签位置
            Element pc_pagination = this.html.getElementsByClass("pc_pagination").first();
            //定位 分页按钮 首页
            Elements as = this.html.select("div.pc_pagination > a");
            if (as.size() == 0) {
                //装配任务数据
                VideoTaskEntity en = new VideoTaskEntity(this.entity);
                // 添加 任务类型
                en.setTaskType(EupVideoTaskType.PARSE_HTML_SIHU_VIDEO_ITEM);
                // 提交任务
                this.ups.submit(en);
                // System.out.println("没有分页");
                return;
            }
            //获取最后一页链接数量
            String href = as.last().attr("href");
            //获取分组分页 数量切割视频地址
            int count = Integer.parseInt(href.substring(href.indexOf("index_") + 6, href.indexOf(".html")));
            //  System.out.println(count);
            String index;

            // 获取视频条目地址拼接
            for (int i = 1; i <= count; i++) {
                index = null;
                index = href.substring(0, href.indexOf("_" + count + ".html"));
                //首页地址
                if (i == 1) {
                    index = index + ".html";
                    //装配任务数据
                    VideoTaskEntity en = new VideoTaskEntity(this.entity);
                    //添加 联网路径
                    en.setTaskPath(index);
                    // 添加 任务类型
                    en.setTaskType(EupVideoTaskType.PARSE_HTML_SIHU_VIDEO_ITEM);
                    // 提交任务
                    this.ups.submit(en);

                    // System.out.println(index);
                } else {
                    index = index + "_" + i + ".html";
                    //装配任务数据
                    VideoTaskEntity en = new VideoTaskEntity(this.entity);
                    //添加 联网路径
                    en.setTaskPath(index);
                    // 添加 任务类型
                    en.setTaskType(EupVideoTaskType.PARSE_HTML_SIHU_VIDEO_ITEM);
                    // 提交任务
                    this.ups.submit(en);

                    // System.out.println(index);
                }

            }

        } catch (Exception e) {
            // html 解析异常 处理
            logger.error("分组计算页面数量 解析异常");
            this.ups.error(this.entity);
        }
    }


    /**
     * 这段代码主要实现了从四虎网站的视频播放页面中解析并获取视频的基本信息，
     * 包括 m3u8 播放地址、
     * 视频上传时间、
     * 视频昵称和视频下载链接。
     * 以下是根据要求添加注释后的代码
     * * 解析四虎 网站视频播放页面
     * * 获取视频基本信息
     * * 1 uir m3u8播放地址
     * * 2 tmp 视频上传时间
     * * 3 name 视频昵称
     * * 4 视频下载链接
     */
    private void videoInfo() {
        try {
            // 封装视频数据对象
            VideoTaskEntity en = new VideoTaskEntity(this.entity);
            // 任务类型设置为 mysql 数据库保存任务
            en.setTaskType(EupVideoTaskType.SQL_TASK_SAVE_SIHU_VIDEO_MESSAGE);

            // 获取 m3u8 链接
            Elements elements = this.html.select("script");
            String m3u8Path = null;
            for (Element element : elements) {
                //返回 script 标签 对象数据
                String var = element.html();
                // 查找匹配字符
                Pattern pattern = Pattern.compile("playUrl=\"//\"+");
                Matcher matcher = pattern.matcher(var);
                if (matcher.find()) {
                    int iplay = var.indexOf("iplay");
                    if (iplay > 0) {
                        //"//"+iplay+"
                        m3u8Path = var.substring(matcher.end() + 8, var.indexOf("\";var posterImg="));

                    } else {
                        m3u8Path = var.substring(matcher.end() + 7, var.indexOf("\";var posterImg="));
                    }

                }

            }
            /*
            // 视频封面图片 下载 图片 保存路径
            String imageDirPath = this.webMvcConfig.getImagePath() + this.entity.getGroupsPath() + "gif";
            try {
                // 创建目录 不存在 则创建 目录
                if (!Files.exists(Paths.get(imageDirPath))) {
                    Files.createDirectories(Paths.get(imageDirPath));
                }
            } catch (IOException e) {
                logger.error("创建 gif 图片保存路径失败");
            }

            // 视频封面图片 下载 图片 保存路径
            String gifName = http.getTime() + ".gif";
            String outFile = imageDirPath + "/" + gifName;
            String imageSize = "320x320";
            // 视频时长
            int duration = VideoUtils.getDuration(this, this.entity.getM3u8Host() + m3u8Path);
            if (duration > 0) {
                // 使用Duration将秒数转换为时间格式
                //Duration duration = Duration.ofSeconds(duration);
                // 将 Duration 转换为 LocalTime
                LocalTime localTime = LocalTime.MIN.plus(Duration.ofSeconds(duration));
                // 将 LocalTime 转换为 Time
                Time time = Time.valueOf(localTime);
                en.setPlayitmp(time);
            }
            int ret = VideoUtils.VideoToGit(this, this.entity.getM3u8Host() + m3u8Path, outFile, imageSize, 10);
            if (ret == 0) {
                en.setImagepath(gifName);
            } else if (ret == -1) {
                this.ups.error(this.entity);
            }
            */
            // System.out.println(http.getTime());
            // 添加m3u8 路径
            en.setPlaym3u8(m3u8Path);
            // System.out.println(m3u8Path);
            // 获取视频信息
            Element magess = this.html.select("div.pannel.clearfix").first();
            String download = magess.select("div.download > a").first().attr("href");
            // 添加 mp4 下载路径
            en.setHttpmp4(download);
            //  System.out.println(download);
            // 视频昵称 data
            String videoName = "";
            try {
                // 视频昵称 data
                videoName = magess.select("H3.title").first().data();
                if (videoName.length() > 3) {
                    videoName = this.decode64(videoName);
                } else {
                    videoName = magess.select("H3.title").first().text();
                }
                if (videoName.length() > 3) {
                    videoName = videoName.substring(3);
                }
            } catch (Exception e) {
                logger.error("视频昵称 解析异常");

            }
            //  System.out.println(videoName);
            // 视频昵称 添加
            en.setName(videoName);
            try {
                magess.select("p.data").get(1).text();
                // 获取时间
                String data = magess.select("p.data").get(1).text();
                // java Sting 转 LocalDate
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                // LocalDate localDate = LocalDate.parse(data, formatter);
                Date date = new Date(data);
                // 添加 视频更新时间
                en.setUptime(date);
                //System.out.println(localDate); // 输出：2023-03-25
            } catch (Exception e) {
                // 添加 视频更新时间
                en.setUptime(new Date());
                logger.error("视频更新时间 解析异常");
            }
            //视频信息添加到 redis 服务器
            this.ups.addVideoMessageRedis(en);

        } catch (Exception e) {
            logger.error("获取视频基本信息 解析异常");
            this.ups.error(this.entity);
        }
    }

    /**
     * 请求网络 获取 html 数据
     * @return 成功返回 true 失败返回 false
     */
    private boolean getRequestToStringSync() {
        try {
            String html = http.getRequestToStringSync(this.entity.getWebHost() + this.entity.getTaskPath());
            //判断联网是否成功请求到数据
            if (html != null) {
                this.html = Jsoup.parse(html);
                return true;
            }

        } catch (IOException e) {
            // 联网异常处理
            logger.error("连接网络异常");

        }

        if (this.html == null && this.count > 20) {
            logger.error("网络连接异常 超过20次");
            this.ups.error(this.entity);
            return false;
        } else {
            this.count++;
            this.getRequestToStringSync();
        }
        return false;
    }

    @Override
    public void run() {
        // 获取网络数据
        if (!this.getRequestToStringSync()) {
            //任务完成 通知系统
            this.ups.finish();
            return;
        }
        switch (this.entity.getTaskType()) {
            case PARSE_HTML_SIHU_MENU:
                //  四虎网站 菜单页面解析
                this.parseMenu();
                break;
            case PARSE_HTML_SIHU_PAGE_COUNT:
                //  视频分组页面数量解析
                this.groupPageCount();
                break;
                //  视频条目解析
            case PARSE_HTML_SIHU_VIDEO_ITEM:
                this.videoItem();
                break;
                //  视频信息解析
             case PARSE_HTML_TASK_SAVE_SIHU_VIDEO_PLAY_PAGE:
                this.videoInfo();
                break;
        }
        //  任务完成 通知系统
        this.ups.finish();

    }

    @Override
    public void error(int messagetype, String message) {

     }

    @Override
    public void readVideo(int count, int readCount) {

    }
}
